package tempsReel;

import java.util.NoSuchElementException;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;

import metiers.Requete;
import metiers.Resultat;

import com.hp.hpl.jena.query.QueryException;
import com.hp.hpl.jena.sparql.engine.http.QueryExceptionHTTP;

@ManagedBean
public class VueRequeteBean {

	@ManagedProperty(value = "#{contextUser}")
	private ContexteUtilisateur contexteUtilisateur;
	private String requete = "Veuillez entrer une requête SPARQL valide";

	public VueRequeteBean() {

	}

	public ContexteUtilisateur getContexteUtilisateur() {
		return contexteUtilisateur;
	}

	public void setContexteUtilisateur(ContexteUtilisateur contexteUtilisateur) {
		this.contexteUtilisateur = contexteUtilisateur;
	}

	public String getRequete() {
		return requete;
	}

	public void setRequete(String requete) {
		this.requete = requete;
	}

	/**
	 * Cette méthode lance la requête sparql et récupère le résultat de cette
	 * requête.
	 * 
	 * @return l'adresse de la page suivante à afficher
	 */
	public String lancerRequete() {

		String retour = "VueChoixOrdres.xhtml";

		// On crée un nouvel objet Requete.
		Requete req = new Requete(requete);

		// Ici on traite la requête et on renvoie les données

		// On intercepte l'exception qui indique que la requête a été mal
		// formulée (QueryException).
		try {
			// On exécute la requête.
			req.executerRequete();
			// On récupère les concepts de la requête.
			req.recupererConcepts();

			// On crée une nouvelle instance de résultats.
			Resultat resultat = new Resultat();
			resultat.setRequete(req);
			resultat.recupererDonnees();
			// resultat.ajouterClustering();

			// On va chercher les meilleurs axes.
			// Cette méthode ne peut pas être testée tant qu'on ne peut pas
			// récupérer les ordres.
			System.out.println("On appelle trouverMeilleursAxes()");
			resultat.trouverMeilleursAxes();
			System.out.println("On sort de trouverMeilleursAxes()");

			// On met à jour le contexte utilisateur
			contexteUtilisateur.setResultat(resultat);

			System.out
					.println("contexte utilisateur à la fin de VueRequeteBean "
							+ contexteUtilisateur.getResultat()
									.getListeConceptsParImportance().toString());

			// On enregistre les résultats de la requête dans un csv
			req.enregistrerCSV();

		} catch (QueryExceptionHTTP eh) {
			// On est dans le cas où dbpedia est down. On réaffiche la page
			// de requête avec un message d'erreur à l'utilisateur.
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,
					"Dbpedia ne répond pas.", "La requête est mal formulée.");
			FacesContext ctx = FacesContext.getCurrentInstance();
			ctx.addMessage("form:requete", msg);
			retour = "VueRequete.xhtml";
		} catch (QueryException e) {
			// On est dans le cas où il y a eu une erreur lors du parsing de
			// la requête en requête sparql. On veut alors réafficher la
			// page avec un message d'erreur à l'utilisateur. Peut-être
			// pourra-t-on ultérieurement laisser la possibilité à
			// l'utilisateur de voir le message d'erreur ?
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,
					"La requête est mal formulée.",
					"La requête est mal formulée.");
			FacesContext ctx = FacesContext.getCurrentInstance();
			ctx.addMessage("form:requete", msg);
			retour = "VueRequete.xhtml";

		} catch (NoSuchElementException se) {
			// A modifier, cela signifie que la requête renvoie 0 résultats.
			// On pourrait peut-être passer à une autre page.
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Pas de résultat", "La requête est mal formulée.");
			FacesContext ctx = FacesContext.getCurrentInstance();
			ctx.addMessage("form:requete", msg);
			retour = "VueRequete.xhtml";
		}

		return retour;
	}

}
